package main

import (
	"errors"
	"fmt"
	"io"
	"log"
	"my-go-chat/model"
	"net"
)

//编写一个函数 完成对UserDao的初始化
func initUserDao() {
	//这里的pool 是一个全局变量  在redis.go中有所体现
	model.MyUserDao = model.NewUserDao(pool)
}

func main() {

	defer func() {
		log.Println("系统已经关闭！")
		recover()
	}()
	//读取文件进行初始化
	listen := initConfig()
	defer listen.Close()
	log.Println("服务启动成功，等待客户端连接服务器中...")
	log.Println("输入shutdown 可关闭服务器")

	//定义一个管道接受关闭信号
	closeCh := make(chan bool)

	//单独一个线程用来操作服务器的启动和关闭
	go func(ch chan bool) {
		var exitkey string = ""
		for {
			fmt.Scanf("%s", &exitkey)
			if exitkey == "shutdown" {
				ch <- true
			}
		}
	}(closeCh)
	for {
		select {
		case <-closeCh:
			log.Panic("正在关闭系统！")
		default:
			conn, err := listen.Accept()
			if err != nil {
				log.Println("listen . Accept err = ", err)
			}
			go ClientProcess(conn)
		}
	}
}

//专门负责客户端通信的写成功
func ClientProcess(conn net.Conn) {
	defer conn.Close()
	pc := &Processor{
		Conn: conn,
	}
	err := pc.MainProcess()
	if err != nil {
		if errors.Is(err, io.EOF) {
			fmt.Println("一个客户端关闭了连接！")
		} else {
			fmt.Println("连接关闭！ err =  ", err)
		}
	}
}
